﻿Public Class ArtikelRapportForm

    Private DUMMY_DATE_VOOR_TOTAAL As Date = Date.MaxValue

    Private _mainForm As Form
    Private _ds As HistoriekDataSet
    Private _startVoorraadHuidigJaar As Integer
    Private _eersteArtikelMetDezeBarcode As ArtikelsDataSet.ArtikelsRow

#Region "Constructors"

    Public Sub New(ByVal mainForm As Form)
        Me.InitializeComponent()
        _mainForm = mainForm
        LabelTitel.Text = ""
    End Sub

#End Region

#Region "Event handlers"

    Private Sub tsbSluiten_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbSluiten.Click
        Me.Close()
    End Sub

    Private Sub InvoerArtikelsControl1_BarcodeConfirmed(ByVal sender As Object, ByVal e As FairShop.InvoerArtikelsControl.BarcodeConfirmedEventArgs) Handles InvoerArtikelsControl1.BarcodeConfirmed
        Try
            Dim barcode As String = InvoerArtikelsControl1.Barcode
            _eersteArtikelMetDezeBarcode = _
                (From a In Utility.Data.Artikels _
                Where a.Barcode = InvoerArtikelsControl1.Barcode _
                And a.Verkoopbaar _
                Select a).FirstOrDefault

            If (_eersteArtikelMetDezeBarcode IsNot Nothing) Then
                LabelTitel.Text = String.Format("Rapport over artikel: {0}", _eersteArtikelMetDezeBarcode.Omschrijving)
                BuildData()
                SetGrafiektype()
                e.BarcodeStatus = InvoerArtikelsControl.BarcodeStatusType.Valid
            Else
                LabelTitel.Text = ""
                _ds = Nothing
                _startVoorraadHuidigJaar = 0
                e.BarcodeStatus = InvoerArtikelsControl.BarcodeStatusType.Invalid
            End If
        Catch ex As Exception
            log.WriteError("ArtikelRapportForm.BarcodeConfirmed", ex)
            MsgBox.ShowError("Fout bij het ophalen van de historiek")
        End Try
    End Sub

    Private Sub rbPin_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) Handles rbPin.CheckedChanged, _
                                                                                           rbBalk.CheckedChanged, _
                                                                                           rbLijn.CheckedChanged
        SetGrafiektype()
    End Sub

    Private Sub rbHuidigJaar_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) Handles rbHuidigJaar.CheckedChanged
        BuildData()
        SetGrafiektype()
    End Sub

    Private Sub GridHistoriek_CellFormatting(ByVal sender As Object, ByVal e As DataGridViewCellFormattingEventArgs) Handles GridHistoriek.CellFormatting
        If (e.ColumnIndex <> DataGridViewHelper.GetGridColumnByDataName("Datum", GridHistoriek).Index) Then Return
        Dim gridRow As DataGridViewRow = GridHistoriek.Rows(e.RowIndex)
        Dim datumValue As Date = DataGridViewHelper.GetValueFromDataGridRow(Of Date)("Datum", gridRow)
        If (datumValue = DUMMY_DATE_VOOR_TOTAAL) Then
            e.Value = ""
        End If
    End Sub

#End Region

#Region "Private methods"

    Private Sub BuildData()
        If (_eersteArtikelMetDezeBarcode IsNot Nothing) Then
            Dim startDatum As Date = Date.MinValue
            If (rbHuidigJaar.Checked) Then
                startDatum = New Date(Today.Year, 1, 1)
            End If
            _ds = Dal.GetArtikelHistoriek(_eersteArtikelMetDezeBarcode.Id, startDatum)
            _startVoorraadHuidigJaar = _eersteArtikelMetDezeBarcode.Voorraad
            BindingSourceHistoriek.DataSource = GetDatasetMetTotaal(_ds)
        Else
            _ds = Nothing
        End If
    End Sub

    Private Sub SetGrafiektype()
        If (_ds Is Nothing) Then Return
        If (rbPin.Checked) Then
            Grafiek1.Type = GrafiekAreaBase.GrafiekType.Pin
        ElseIf (rbBalk.Checked) Then
            Grafiek1.Type = GrafiekAreaBase.GrafiekType.Blok
        Else
            Grafiek1.Type = GrafiekAreaBase.GrafiekType.Lijn
        End If
        If (rbHuidigJaar.Checked) Then
            Grafiek1.SetData(_ds, _startVoorraadHuidigJaar)
        Else
            Grafiek1.SetData(_ds, 0)
        End If
        Grafiek1.Invalidate()
    End Sub

    Private Function GetDatasetMetTotaal(ByVal ds As HistoriekDataSet) As HistoriekDataSet
        Dim ds2 As HistoriekDataSet = DirectCast(ds.Clone(), HistoriekDataSet)
        ds2.Historiek.Merge(ds.Historiek)

        Dim startVoorraad As Integer = 0
        If (rbHuidigJaar.Checked) Then
            startVoorraad = _startVoorraadHuidigJaar
        End If

        Dim totaal As Integer = (From h In ds.Historiek Select h.Waarde).Sum()

        Dim beginvoorraadRij As HistoriekDataSet.HistoriekRow = ds2.Historiek.NewHistoriekRow()
        beginvoorraadRij.Datum = DUMMY_DATE_VOOR_TOTAAL
        beginvoorraadRij.Naam = "Beginvoorraad"
        beginvoorraadRij.Waarde = startVoorraad
        ds2.Historiek.AddHistoriekRow(beginvoorraadRij)

        Dim bewegingRij As HistoriekDataSet.HistoriekRow = ds2.Historiek.NewHistoriekRow()
        bewegingRij.Datum = DUMMY_DATE_VOOR_TOTAAL
        bewegingRij.Naam = "Totaal"
        bewegingRij.Waarde = totaal
        ds2.Historiek.AddHistoriekRow(bewegingRij)

        Dim eindvoorraadRij As HistoriekDataSet.HistoriekRow = ds2.Historiek.NewHistoriekRow()
        eindvoorraadRij.Datum = DUMMY_DATE_VOOR_TOTAAL
        eindvoorraadRij.Naam = "Eindvoorraad"
        eindvoorraadRij.Waarde = startVoorraad + totaal
        ds2.Historiek.AddHistoriekRow(eindvoorraadRij)

        If (startVoorraad + totaal <> _eersteArtikelMetDezeBarcode.VerwachteVoorraad) Then
            Dim verwachteVoorraadRij As HistoriekDataSet.HistoriekRow = ds2.Historiek.NewHistoriekRow()
            verwachteVoorraadRij.Datum = DUMMY_DATE_VOOR_TOTAAL
            verwachteVoorraadRij.Naam = "Verwachte voorraad"
            verwachteVoorraadRij.Waarde = _eersteArtikelMetDezeBarcode.VerwachteVoorraad
            ds2.Historiek.AddHistoriekRow(verwachteVoorraadRij)
        End If

        Return ds2
    End Function

#End Region

End Class